/*
 * \file MapAdaptateur.h
 *
 * \author Thibaut ALGRIN
 * \author Emmanuel CARRE
 *
 * \version 1.0
 * \date 14 déc. 2011
 */

#ifndef LISTADAPTATEUR_H_
#define LISTADAPTATEUR_H_

#include <list>
#include "EnsembleCouples.h"

namespace tp3
{
	/*
	 * \class ListAdaptateur
	 * \brief Classe permettant de faire le lien entre la classe Memoizer et le conteneur std::list
	 * \fn ListAdaptateur<TypeCle, TypeValeur>
	 */
	template<typename TypeCle, typename TypeValeur>
	class ListAdaptateur
	{
	public:
		/*
		 * \brief Constructeur de la Classe ListAdaptateur
		 * \param unsigned int taille_maximale
		 * \fn ListAdaptateur(unsigned int taille_maximale)
		 */
		ListAdaptateur(unsigned int taille_maximale);
		/*
		 * \brief Méthode permettant d'afficher le contenue dont la clé est la même
		 * \param const TypeCle& cle
		 * \fn TypeValeur lire(const TypeCle& cle) const
		 * \return la valeur de l'element TypeValeur
		 */
		TypeValeur lire(const TypeCle& cle) const;
		/*
		 * \brief Méthode permettant de savoir si la table n'est pas vide
		 * \fn ListAdaptateur<TypeCle, TypeValeur>::nEstPasPlein() const
		 * \return true ou false
		 */
		bool nEstPasPlein() const;
		/*
		 * \brief Méthode permettant d'ajouter un élément
		 * \param const TypeCle& cle
		 * \param const TypeValeur& valeur
		 * \fn ListAdaptateur<TypeCle, TypeValeur>::ajouter(const TypeCle& cle, const TypeValeur& valeur)
		 * \post throw ErreurDictionnairePlein = si la clé n'existe pas
		 */
		void ajouter(const TypeCle& cle, const TypeValeur& valeur);
		/*
		 * \brief Méthode permettant de lister tout les éléments
		 * \fn ListAdaptateur<TypeCle, TypeValeur>::listerElements() const
		 * \return EnsembleCouples<TypeCle, TypeValeur>
		 */
		EnsembleCouples<TypeCle, TypeValeur> listerElements() const;

	private:
		std::list< std::pair< TypeCle, TypeValeur > > m_liste;
		unsigned int m_taille_maximale;
	};

}

#include "ListAdaptateur.inl"

#endif /* LISTADAPTATEUR_H_ */
